package second.codeTop.package2;

import util.TreeNode;

public class LC236 {
    //二叉树的最近公共祖先
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        /**
         * p,q节点在root节点下同一侧的子树上，左子树或者右子树上
         * p,q节点在root节点不同侧的子树上，那么最近的祖先就是root
         * p,q只有一个在该树中，或者都不在该树中
         */
        if (root == null) {
            return null;
        }
        // p,q有一个为根节点
        if (root.val == p.val || root.val == q.val) {
            return root;
        }
        // p,q节点在root的左侧
        if (dfs(root.left, p) && dfs(root.left, q)) {
            return lowestCommonAncestor(root.left, p, q);
        }
        if (dfs(root.right, p) && dfs(root.right, q)) {
            return lowestCommonAncestor(root.right, p, q);
        }
        //p,q在根节点的两侧
        return root;
    }

    //
    public static boolean dfs(TreeNode root, TreeNode target) {
        // 到达非叶节点
        if (root == null) {
            return false;
        }
        if (root.val == target.val) {
            return true;
        }
        return dfs(root.left, target) || dfs(root.right, target);
    }
}
